#include "stdio.h"
#include "stdlib.h"
#define size_old 3*sizeof(data)

typedef struct data
{
    int T;
    int F;
} data;

data *my_realloc(data **D, size_t new_siz, size_t old_siz);

int main(int argc, char const *argv[])
{
    // 分配动态内存
    data *d = (data *)malloc(size_old);
    //printf("%ld",size_old/sizeof(data));

    d[0].T = 1;
    d[0].F = 3;
    d[1].T = 5;
    d[1].F = 7;
    d[2].T = 9;
    d[2].F = 11;    
    printf("d[1].T = %d\td[1].F = %d\n",d[1].T,d[1].F);

    int n;//输入要要创建的新动态空间的大小
    if (d == NULL)
    {
        printf("动态内存创建失败!");
    }
    printf("请输入你要创建的新动态空间的大小 n 个 sizeof(data)");
    scanf("%d",&n);

    data *new_D;
    new_D = my_realloc(&d, n*sizeof(data), size_old); // 返回的新动态内存空间
    
    if (new_D == NULL)
    {
        printf("动态内存创建失败!\n");
    }
    else
    {
        printf("动态内存创建成功\n");

        for (size_t i = 0; i < n; i++)
        {
            printf("new_D[%ld].T = %d\tnew_D[%ld].F = %d\n",i,new_D[i].T,i,new_D[i].F);
        }
        
    }
    
    // 关闭新动态内存空间
    free(new_D);
    new_D == NULL;
    return 0;
}



data *my_realloc(data **D, size_t new_siz, size_t old_siz)
{
    if (new_siz > old_siz)
    {
        data *new_D = (data *)malloc(new_siz); // 创建新的动态内存

        for (size_t i = 0; i < (size_old/sizeof(data)); i++)
        {
            new_D[i]= *(*D+i); // 将原本的数据传到新空间 =================有问题
        }

        free(*D); // 释放新空间
        *D = NULL;
        return new_D; // 返回新空间
    }

    else if (new_siz == 0)
    {
        free(*D);//释放动态内存
        *D = NULL;

        return NULL;
    }

    else if (new_siz <= old_siz)
    {
        data *new_D = (data *)malloc(new_siz); // 创建新的动态内存
    
        for (size_t i = 0; i < new_siz/sizeof(data); i++)
        {
            new_D[i]= *(*D+i);;//存一部分数据
        }
        
        free(*D); // 释放新空间
        *D = NULL;
        return new_D; // 返回新空间
    }
    
    else if (*D == NULL)
    {
        data *new_D = (data *)malloc(new_siz); // 创建新的动态内存
        return new_D; // 返回新空间
    }
    

    // 关闭旧的动态内存
    // free(D);//D
}
